#include<stdio.h>
#include<stdlib.h>
#define MaxSize 20
struct
{
	char ch;
	int pri;
}lpri[7] = { {'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6} },
rpri[7]={ { '=',0 },{ '(',6 },{ '*',4 },{ '/',4 },{ '+',2 },{ '-',2 },{ ')',1 } };
int leftpri(char op);
int rightpri(char op);
bool InOp(char ch);
int Precede(char op1, char op2);
void trans(char *exp,char postexp[]);
int main(){
	int i=0,flag=1;
	char s[50],c[50];
	char ch;
	while((ch=getchar())!='\n'){
		s[i]=ch;
		i++;
	}
	s[i]='\0';
	trans(s,c);
	for(i=0;c[i]!='\0';i++){
		printf("%c",c[i]);
	}
	//printf("a");
}
int leftpri(char op)
{
	int i;
	for (i = 0; i < 7; i++) {
		if (lpri[i].ch == op) return lpri[i].pri;
	}
}
int rightpri(char op) {
	int i;
	for (i = 0; i < 7; i++) {
		if (rpri[i].ch == op)
			return rpri[i].pri;
	}
}
bool InOp(char ch)
{
	if (ch == '(' || ch == ')' || ch == '+' || ch == '-' || ch == '*' || ch == '/')
		return true;
	else
		return false;
}
int Precede(char op1, char op2)
{
	if (leftpri(op1) == rightpri(op2))
		return 0;
	else if (leftpri(op1) < rightpri(op2))
		return -1;
	else 
		return 1;
}
void trans(char *exp,char postexp[]){
	struct{
		char data[MaxSize];
		int top;
	}op;
	int i=0,flag=1;
	op.top=-1;
	op.top++;
	op.data[op.top]='=';
	while(*exp!='\0'){
		
		if(!InOp(*exp))
		{
		while(*exp>='0' && *exp<='9'||*exp=='.')
	 {        
				postexp[i++]=*exp;
			exp++;
		}
		if(*exp!='\0'){
			flag=0;
			postexp[i++]=' ';
		}
		else if(*exp=='\0'&&flag==0)
		postexp[i++]=' ';
	}
	else
	switch(Precede(op.data[op.top],*exp))
	{
		case -1:
			op.top++;op.data[op.top]=*exp;
			exp++;
			break;
		case 0:
			op.top--;
			exp++;
			break;
		case 1:
			postexp[i++]=op.data[op.top];
			postexp[i++]=' ';
			op.top--;
			break;
	}
}
        while(op.data[op.top]!='=')
        {
            
			postexp[i++]=op.data[op.top];
			if(op.data[op.top-1]!='=')
            postexp[i++]=' ';
        	op.top--;
		}
		postexp[i]='\0';
		
}
